<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div>
    <h2>一、方式</h2>
    <div>javaScript本地缓存的方法我们主要讲述以下四种：</div>
    <ul>
      <li>cookie</li>
      <li>sessionStorage</li>
      <li>localStorage</li>
      <li>indexedDB</li>
    </ul>
    <h4>cookie</h4>
    <div>Cookie，类型为「小型文本文件」，指某些网站为了辨别用户身份而储存在用户本地终端上的数据。是为了解决 HTTP无状态导致的问题</div>
    <br>
    <div>一般不超过 4KB 的小型文本数据，它由一个名称（Name）、一个值（Value）和其它几个用于控制 cookie有效期、安全性、使用范围的可选属性组成</div>
    <script>
      // 关于cookie常用的属性如下：
      // Expires 用于设置 Cookie 的过期时间
      // Expires=Wed, 21 Oct 2015 07:28:00 GMT
      // Max-Age 用于设置在 Cookie 失效之前需要经过的秒数（优先级比Expires高）
      // Max-Age=604800
      // Domain指定了 Cookie 可以送达的主机名
      // Path指定了一个 URL路径，这个路径必须出现在要请求的资源的路径中才可以发送 Cookie 首部
      // Path=/docs   # /docs/Web/ 下的资源会带 Cookie 首部
    </script>
    <h4>localStorage</h4>
    <ul>
      <li>生命周期：持久化的本地存储，除非主动删除数据，否则数据是永远不会过期的</li>
      <li>存储的信息在同一域中是共享的</li>
      <li>当本页操作（新增、修改、删除）了localStorage的时候，本页面不会触发storage事件,但是别的页面会触发storage事件。</li>
      <li>大小：5M（跟浏览器厂商有关系）</li>
      <li>localStorage本质上是对字符串的读取，如果存储内容多的话会消耗内存空间，会导致页面变卡</li>
      <li>受同源策略的限制</li>
    </ul>
    <script>
      // 设置 localStorage.setItem('username','cfangxu');
      // 获取 localStorage.getItem('username')
      // 获取键名 localStorage.key(0) //获取第一个键名
      // 删除 localStorage.removeItem('username')
      // 一次性清除所有存储 localStorage.clear()
    </script>
    <div>localStorage 也不是完美的，它有两个缺点：</div>
    <ul>
      <li>无法像Cookie一样设置过期时间</li>
      <li>只能存入字符串，无法直接存对象</li>
    </ul>
    <h4>sessionStorage</h4>
    <div>sessionStorage和 localStorage使用方法基本一致，唯一不同的是生命周期，一旦页面（会话）关闭，sessionStorage 将会删除数据</div>
    <h4>indexedDB</h4>
    <div>indexedDB是一种低级API，用于客户端存储大量结构化数据(包括, 文件/ blobs)。该API使用索引来实现对该数据的高性能搜索</div>
    <div>优点</div>
    <ul>
      <li>储存量理论上没有上限</li>
      <li>所有操作都是异步的，相比 LocalStorage 同步操作性能更高，尤其是数据量较大时</li>
      <li>原生支持储存JS的对象</li>
      <li>是个正经的数据库，意味着数据库能干的事它都能干</li>
    </ul>
    <div>缺点</div>
    <ul>
      <li>操作非常繁琐</li>
      <li>本身有一定门槛</li>
    </ul>
    <div>关于使用indexdb的使用会比较繁琐，大家可以通过使用Godb.js库进行缓存，最大化的降低操作难度</div>
    <h2>二、区别</h2>
    <div>关于cookie、sessionStorage、localStorage三者的区别主要如下：</div>
    <ul>
      <li>存储大小：cookie数据大小不能超过4k，sessionStorage和localStorage虽然也有存储大小的限制，但比cookie大得多，可以达到5M或更大</li>
      <li>有效时间：localStorage存储持久数据，浏览器关闭后数据不丢失除非主动删除数据；sessionStorage数据在当前浏览器窗口关闭后自动删除；cookie设置的cookie过期时间之前一直有效，即使窗口或浏览器关闭</li>
      <li>数据与服务器之间的交互方式，cookie的数据会自动的传递到服务器，服务器端也可以写cookie到客户端；sessionStorage和localStorage不会自动把数据发给服务器，仅在本地保存</li>
    </ul>
    <h2>三、应用场景</h2>
    <ul>
      <li>标记用户与跟踪用户行为的情况，推荐使用cookie</li>
      <li>适合长期保存在本地的数据（令牌），推荐使用localStorage</li>
      <li>敏感账号一次性登录，推荐使用sessionStorage</li>
      <li>存储大量数据的情况、在线文档（富文本编辑器）保存编辑历史的情况，推荐使用indexedDB</li>
    </ul>
  </div>
</body>
</html>